#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <cassert>
#include <sys/types.h>

using namespace std;

void handler(int signo)
{
    cout<<signo<<" 号信号递达处理..."<<endl;
}

void Printsig(sigset_t &pending)
{
    cout << "pending bitmap is: ";
    for(int signo=31; signo>0; signo--)
    {
        if(sigismember(&pending, signo))
        {
            cout<<"1";
        }
        else 
        {
            cout<<"0";
        }
    }
    cout<<endl;
}
int main()
{
    // 捕捉信号——自定义处理
    signal(2, handler);

    // 屏蔽2号信号
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigaddset(&block, 2); // 未设置到进程的PCB位图中
    // 真正屏蔽
    int n = sigprocmask(SIG_SETMASK, &block, &oblock);
    assert(n == 0);
    cout << "signal shield success" << "pid: "<< getpid() <<endl;
    int cnt = 0;
    while (true)
    {
        // 获取进程的pending位图
        sigset_t pending;
        sigemptyset(&pending);
        n = sigpending(&pending);
        assert(n == 0);

        // 打印
        Printsig(pending);
        
        cnt++;
        //解除屏蔽2号信号
        if(cnt == 20)
        {
            cout<<"解除屏蔽2号信号"<<endl;
            n = sigprocmask(SIG_UNBLOCK, &block, &oblock);
            assert(n == 0);
        }

        sleep(1);
    }
    return 0;
}